/**
 * @fileoverview 게시판 공통 스크립트
 * @author hicode@netville.co.kr
 * @version 1.0.0
 * @since 2008.08.28
 */

var bbsCommon = {};

/**
 * 이미지 뷰어
 */
bbsCommon.ImageViewer = {
    
    /**
     * 초기화
     * @param {string} elementId 엘리먼트 ID
     * @param {int} width 최대 가로 사이즈
     * @param {int} height 최대 세로 사이즈
     */
    init : function(elementId, width, height) {
        if(nv.$(elementId)) {
            width = width ? width : 500;
            height = height ? height : 500;
            nv.Img.resizeImages(nv.$(elementId), width, height, true, "원본보기");
            var imgList = nv.$(elementId).getElementsByTagName("img");
            for(var i=0; i<imgList.length; i++) {
                var imageElement = imgList.item(i);
                nv.Event.addListener(imageElement, "click", this.viewImageDiv);
            }
        }
    },
    
    /**
     * 리사이즈된 이미지 원본보기
     */
    viewImageDiv: function(e) {
        var event = window.event || e;
        var targetElement = nv.Event.getTarget(event);
        
        var imgSrc = targetElement.src; 
        if(imgSrc.indexOf("?") > -1) {
            imgSrc += "&original=true"; 
        } else {
            imgSrc += "?original=true";
        }

        var htmlTxt = "";
        htmlTxt += "<div class=\"result_view\"> ";
        // 아래 IE에서 100% 표시되어 주석처리
        /*
        htmlTxt += "    <div class=\"head\">";
        htmlTxt += "        <div class=\"title\">이미지 원본보기</div>";
        htmlTxt += "        <div class=\"close\"><a href=\"javascript:nv.LBox.off();\"><img src=\"../../doc/images/bbs/btn_close.gif\"></a></div>";
        htmlTxt += "    </div>";
        */
        htmlTxt += "    <div class=\"body\" align=\"center\">";
        htmlTxt += "        <img src=\"" + imgSrc + "\"";
//        htmlTxt += "             width=\"" + targetElement.getAttribute("originalWidth") + "\"";
//        htmlTxt += "             height=\"" + targetElement.getAttribute("originalHeight") + "\"";
        htmlTxt += "             onclick='nv.LBox.off();' title='원본 닫기' style='cursor: pointer;' />";        
        htmlTxt += "    </div>";
        htmlTxt += "</div>";
        nv.LBox.on(htmlTxt);
        
        // 팝업으로 띄울 경우
        // nv.Popup.open(targetElement.src, "aa", targetElement.getAttribute("originalWidth"), targetElement.getAttribute("originalHeight"), "yes");
    },
    
    /**
     * 리스트 이미지 원본보기
     */
    viewOriginalImageDiv: function(imageSrc, width, height) {
        var htmlTxt = "";
        htmlTxt += "<div class=\"result_view\"> ";
        htmlTxt += "    <div class=\"body\" align=\"center\">";
        htmlTxt += "        <img src=\"" + imageSrc + "&original=true\"";
        htmlTxt += "             width=\"" + width + "\"";
        htmlTxt += "             height=\"" + height + "\"";
        htmlTxt += "             onerror='bbsCommon.setDefaultImage(this, 300, 300);'";                
        htmlTxt += "             onclick='nv.LBox.off();' title='원본 닫기' style='cursor: pointer;' />";        
        htmlTxt += "    </div>";
        htmlTxt += "</div>";
        nv.LBox.on(htmlTxt);    
    }
}



/**
 * 알럿 메세지 표시
 */
bbsCommon.alertMsg = function(messageText) {
    var htmlTxt = "";
    /*
    htmlTxt += "<div class=\"message_box\" align=\"center\">";
    htmlTxt += "    <div class=\"message\">";
    htmlTxt += "        <div class=\"icon\"><img src=\"../../doc/images/bbs/etc_icon.gif\"></div>";
    htmlTxt += "        <div class=\"text\" align=\"left\">" + messageText + "</div>";
    htmlTxt += "    </div>";
    htmlTxt += "    <div class=\"clear\"></div>";
    htmlTxt += "    <div align=\"center\" class=\"btn\">";
    htmlTxt += "        <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
    htmlTxt += "            <tr>";
    htmlTxt += "                <td><img src=\"../../doc/images/bbs/btn01_l.gif\"></td>";
    htmlTxt += "                <td class=\"btn01_m\"><a href=\"javascript:nv.LBox.off();\">확인</a></td>";
    htmlTxt += "                <td><img src=\"../../doc/images/bbs/btn01_r.gif\"></td>";
    htmlTxt += "            </tr>";
    htmlTxt += "        </table>";
    htmlTxt += "    </div>";
    htmlTxt += "</div>";
    nv.LBox.on(htmlTxt);
    */
    alert(messageText);
}



/**
 * 검색단어 하이라이트 처리
 */
bbsCommon.MarkSearchWord = {
    
    /**
     * 초기화
     * @param {object} rootNode 기준노드
     * @param {string} className class명
     * @param {string} word 검색단어
     */
    init : function(rootNode, className, word) {
        if(nv.Str.trim(word) == "") return;

        // class명으로 노드목록 획득
        var classNameNodeArray = nv.Dom.getNodeListByClassName(rootNode, className);
        for(var i=0; i<classNameNodeArray.length; i++) {
            rootNode = classNameNodeArray[i];
        
            // 노드의 텍스트 노드
            var textNodeArray = this.getTextNodeList(rootNode, word);
              
            for(var j=0; j<textNodeArray.length; j++) {
                var textNode = textNodeArray[j];
                var textNodeValue = textNode.nodeValue;
                var textNodeParent = textNode.parentNode;
                this.markingSearchWord(textNodeValue, word, textNode, textNodeParent);
                textNodeParent.removeChild(textNode);            
            }
        
        }
    },
    
    getTextNodeList : function(rootNode, word, nodeList) {
        if(!nodeList) nodeList = new Array();
        if(rootNode.nodeType == 3) {  // text node
            if(rootNode.nodeValue.toLowerCase().indexOf(word.toLowerCase()) > -1) {
                nodeList.push(rootNode);
            }
        }
        // 자식노드가 있을경우 재귀호출
        for(var i=0; i<rootNode.childNodes.length; i++) {
            this.getTextNodeList(rootNode.childNodes.item(i), word, nodeList);
        }  // ~for(i)
        return nodeList;
    },
    
    markingSearchWord : function(textNodeValue, word, textNode, textNodeParent) {
        var head = "";
        var targetWord = "";
        var tail = "";
        
        var idx = textNodeValue.toLowerCase().indexOf(word.toLowerCase());
        
        // 텍스트노드에 검색단어가 포함되어 있다면 (대소문자 구분하지 않음)
        if(idx > -1) {
            head = textNodeValue.substring(0, idx);
            targetWord = textNodeValue.substring(idx, idx + word.length);
            tail = textNodeValue.substring(idx + word.length, textNodeValue.length);        
    
            // 머리부분에 검색단어 발견시 재귀호출
            if(head.length > 0) {
                if(head.toLowerCase().indexOf(word.toLowerCase()) > -1) {
                    this.markingSearchWord(head, word, textNode, textNodeParent);
                } else {
                    var headTextNode = document.createTextNode(head);
                    textNodeParent.insertBefore(headTextNode, textNode);
                }
            }
            
            // 몸통(검색단어 부분)에 span 태그를 입힌다.
            var targetWordSpanElement = document.createElement("span");
            targetWordSpanElement.style.backgroundColor = "yellow";
            var targetWordTextNode = document.createTextNode(targetWord);
            targetWordSpanElement.appendChild(targetWordTextNode);
            textNodeParent.insertBefore(targetWordSpanElement, textNode);
            
            // 꼬리부분에 검색단어 발견시 재귀호출
            if(tail.length > 0) {
                if(tail.toLowerCase().indexOf(word.toLowerCase()) > -1) {
                    this.markingSearchWord(tail, word, textNode, textNodeParent);
                } else {
                    var headTextNode = document.createTextNode(tail);
                    textNodeParent.insertBefore(headTextNode, textNode);
                }
            }
        }        
    }

}



/**
 * 태그 유효성 체크
 * @param {string} tags 태그
 * @return {boolean} 유효성 여부
 */
bbsCommon.tagValidator = function(tagElement){
    if(!tagElement) return true;
    var parseTags = tagElement.value.split(",");
    var tagArray = new Array();
    for(var i=0; i<parseTags.length; i++) {
        var trimTag = nv.Str.trim(parseTags[i]); 
        if(trimTag.length > 30) {
            bbsCommon.alertMsg("30자가 넘는 태그를 입력하셨습니다.");
            return false;
        }
        for(var j=i+1; j<parseTags.length; j++){
            // 중복 태그 삭제
            if(trimTag == nv.Str.trim(parseTags[j])) {
                 parseTags.splice(j, 1);
                 j--;
            }
        }
        if(trimTag != "") {
            tagArray.push(trimTag);
        }
    }
    // 태그 개수 체크
    if(tagArray.length > 10) {
        bbsCommon.alertMsg("태그는 10개까지 입력하실 수 있습니다.");
        return false;
    }
    // 정리된 태그를 element에 세팅
    var tagValue = "";
    for(i=0; i<tagArray.length; i++) {
        if(i>0) tagValue += ",";
        tagValue += tagArray[i];
    }
    tagElement.value = tagValue;
    return true;
}



/**
 * 즐겨찾기
 */   
bbsCommon.FavoriteBoard = {
    /**
     * 즐겨찾기 등록
     * @param {string} boardId 게시판 ID 
     */
    add : function(boardId) {
        var param = "";
        param += "boardId=" + boardId;   
        new nv.Ajax("../../mybbs/favorite/write.do", param, this.callback_AddFavoriteBoard, "POST", "JSON");
    }, 

    callback_AddFavoriteBoard : function(resultObj) {
        if(resultObj.result == "success"){
            bbsCommon.alertMsg("게시판을 즐겨찾기에 추가 하였습니다.");
        } else if(resultObj.result == "aleady") {
            bbsCommon.alertMsg("이미 추가된 게시판입니다.");
        } else {
            bbsCommon.alertMsg("잠시 후 다시 시도해 주세요.");
        }
    }
}



/**
 * 기본 이미지를 표시한다.
 * ex) onerror="bbsCommon.setDefaultImage(this, 300, 300);"
 */
bbsCommon.setDefaultImage = function(imageObj, width, height) {
    imageObj.src = "../ksnet/images/img_noimg.png";
    if(width) imageObj.width = width;
    if(height) imageObj.height = height;
}

bbsCommon.setCommentDefaultImage = function(imageObj, width, height) {
    imageObj.src = "../ksnet/images/img_profile.png";
    if(width) imageObj.width = width;
    if(height) imageObj.height = height;
}